#pragma once
#include"Common.hpp"

class ThreadCache
{
public:
    //申请和释放内存
    void* Allocate(size_t size);// 申请size大小的对象 返回指针
    void Deallocate(void* ptr,size_t size);// 给出需要释放的对象指针和大小(计算桶映射)

    //从中心缓存获取对象
    void* FetchFromCentralCache(size_t index, size_t size);

    //释放对象时，链表过长时，回收内存到中心缓存
    void ListTooLong(FreeList& lis, size_t size);
private:
    //用FreeList数组模拟哈希桶， 每个_freeLists[index]都是一个FreeList，挂分好的小块内存对象，一共208个桶
    FreeList _freeLists[NFREELIST];
};
static thread_local ThreadCache* pTLSThreadCache=nullptr; 
// 为 每一个线程 各自创建并维护一份 独立的 ThreadCache* 变量
// 变量名字都叫 pTLSThreadCache，但它们 互不干扰
// 给每个线程单独准备一根 ThreadCache* 指针，初始为空，彼此独立
// 变量存储方法 这个变量在他所在的线程内是全局可访问的 但是不能被其他线程访问到 保证线程的独立性